/*
 * Copyright 2019-2022 Mamoe Technologies and contributors.
 *
 * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
 * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
 *
 * https://github.com/mamoe/mirai/blob/dev/LICENSE
 */

package net.mamoe.mirai.internal.utils

internal fun <T, M : Comparable<M>> List<T>.indexFirstBE(
    value: M,
    mapping: (T) -> M
): Int {
    var (left, right) = 0 to size - 1
    var index = -1
    while (left <= right) {
        val middle = left + (right - left) / 2
        if (mapping(get(middle)) >= value) {
            index = middle
            right = middle - 1
        } else {
            left = middle + 1
        }
    }
    return index
}